#include <iostream>
#include <string>
#include <pthread.h>
#include <cstdlib>
#include <unistd.h>

using namespace std;

std::string toHex(pthread_t tid)
{
    char hex[64];
    snprintf(hex,sizeof(hex),"%p",tid);
    return hex;
}

void *threadRoutine(void *args)
{
    while(true)
    {
        cout << "thread id: " << toHex(pthread_self()) << endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    pthread_create(&tid,nullptr,threadRoutine,(void*)"thread 1");
    cout << "main thread creat thread done,new thread id: " << toHex(tid) << endl;
    pthread_join(tid,nullptr);
    return 0;
}

// void threadrun()
// {
//     while(true)
//     {
//         cout << "I am a new thread for c++" << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     thread t1(threadrun);
//     t1.join();
//     return 0;
// }

// class Request
// {
// public:
//     int _start;
//     int _end;
//     string _threadname;
// public:
//     Request(int start,int end,const string &threadname)
//         :_start(start)
//         ,_end(end)
//         ,_threadname(threadname)
//     {}
// }

// class Response
// {
// public:
//     int _result;
//     int _exitcode;
// public:
//     Response(int result,int exitcode)
//         :_result(result)
//         ,_exitcode(exitcode)
//     {}
// }

// void *sumCount(void *args)
// {
//     Request *rq = static_cast<Request*>(args);
//     Response *rsp = new Response(0,0);
//     for(int i=rq->_start;i<=rq->_end;i++)
//     {
//         cout << rq->_threadname << "is runing,calling..., " << i << endl;
//         rsp->_result +=i;
//         usleep(10000);
//     }
//     delete rq;
//     return rsp;
// }

// int main()
// {
//     pthread_t tid;
//     Request *rq = new Request(1,1oo,"thread 1");
//     pthread_create(&tid,nullptr,sumCount,rq);

//     void *ret;
//     pthread_join(tid,&ret);
//     Response *rsp = static_cast<Response *>(ret);
//     cout << "rsp->result: " << rsp->_result << ",exitcode: " << rsp->_exitcode << endl;
//     delete rsp;
//     return 0;
// }


// int g_val = 100;

// void show(const string &name)
// {
//     cout << name << "say# " << "hello thread" << endl;
// }

// void* threadRoutine(void*args)
// {
//     const char *name = (const char*)args;
//     int cnt = 5;
//     while(true)
//     {
//         printf("%s, pid: %d, g_val: 0x%p\n",name,getpid(),g_val,&g_val);
//         cout << "new thread, pid: " << getpid() << endl;
//         show("[new thread]");
//         sleep(1);

//         //信号
//         // int a= 10;
//         // a /= 0;
//         // cnt--;
//         // if(cnt == 0)breadk;
//     }
//     //线程退出1
//     // pthread_exit((void*)100);
//     //进程退出
//     //exit(11);
//     //线程退出2
//     //return (void*)100;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadRoutine,(void*)"Thread 1");

//     //取消新线程
//     // sleep(1);
//     // pthread_cancel(tid);

    
//     sleep(1);
//     return 0;
//     while(true)
//     {
//         printf("main thread pid: %d, g_val: 0x%p, create new thread tid: %p\n",getpid(),g_val,&g_val,tid);
//         cout << "main thread, pid: " << getpid() << ",g_val: " << g_val << ",&g_val:" << &g_val << endl;
//         show("[main thread]");
//         sleep(1);
//         g_val++;
//     }
//     sleep(7);
//     void *retval;
//     //线程等待，默认阻塞等待
//     pthread_join(tid,&retval);

//     cout << "main thread quit ...,ret: " << (long long int)retval << endl;
//     return 0;
// }